package com.cskaoyan.javase.oop3._2inner._1member._0introduction;

import com.sun.org.apache.bcel.internal.generic.NEW;

/**
 * 成员内部类的最大特点:
 *      成员内部类可以近似的看成一个外围类的成员
 *      -->
 *      成员内部类的对象必须依赖于外围类对象而存在
 *      具体来说就是,一个成员内部类对象
 *          必须持有外围类对象的引用作为自身成员变量
 *
 *      因为以上特点,成员内部类的成员特点就是:
 *          没有static声明
 *
 * 成员内部类是最普通的内部类，它定义在另一个类的成员位置
 * 语法:
 * //外围类
 * [访问权限修饰符] class EnclosedClazz{
 * //成员内部类
 *   [访问权限修饰符] class InnerClazz{
 *  }
 * }
 *
 * 首先研究成员内部类的自身特点,主要从以下几个角度分析：
 *      1.访问权限修饰符
 *          普通类访问级别只有两种,public和默认
 *          但是成员内部类有四种访问权限
 *          普遍来说,既然定义内部类,往往都是为了隐藏类
 *          访问权限大多是private
 *
 *      2.成员特点
 *          没有static声明,其他的和普通类一样
 *          具体来说就是没有静态方法,静态变量,静态代码块
 *          但是允许定义字面值常量赋值的全局常量
 *
 *      3.继承和实现
 *          可以继承,可以实现
 *          继承外部类,实现外部接口等都是可以的
 *      思考:
 *          在有访问权限的前提下,如何让一个外部类继承一个成员内部类呢?
 *          这个继承是可以的
 *
 * @since 16:13
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}

// class A extends EnclosedClazz.InnerClazz {}
// 外围类
class EnclosedClazz {
    class A {
    }

    class B {
    }

    interface IA {
    }

    // 成员内部类
    class InnerClazz extends A implements IA {
        int a;
        private int b;
        static final int C = 10;
        static final String D = "123";

        // static final String E = new String();
        // static int c;
        // static void test(){}
        // static {}
        public void test() {
        }

        {
        }

        public InnerClazz() {
        }
    }
}